package com.kylin.pool;

//Executors 工具类，3大方法

import java.util.concurrent.*;

public class Demo01 {
    public static void main(String[] args) {
        //ExecutorService threadPool = Executors.newSingleThreadExecutor();//单个线程
        //ExecutorService threadPool = Executors.newFixedThreadPool(5);//创建一个固定的线程池大小
        //ExecutorService threadPool = Executors.newCachedThreadPool();//伸缩，遇强则强



        //自定义线程池 ThreadPoolExecutor
        //最大线程如何定义？
        //1。CPU 密集型 几核 就是几，可以保持CPU的效率最高
        //2。IO  密集型 大于程序中十分耗IO的线程，一般是两倍
        //获取CPU核数
        System.out.println(Runtime.getRuntime().availableProcessors());
        ExecutorService threadPool = new ThreadPoolExecutor(
                2,
                Runtime.getRuntime().availableProcessors(),
                3,
                TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(3),
                Executors.defaultThreadFactory(),
                //new ThreadPoolExecutor.AbortPolicy()//超出最大承载不处理，抛出异常。
                //new ThreadPoolExecutor.CallerRunsPolicy()//超出最大承载哪来的去哪里执行 这里是main线程来的，main线程处理
                //new ThreadPoolExecutor.DiscardPolicy()//超出最大承载不执行 不抛出异常
                new ThreadPoolExecutor.DiscardOldestPolicy()//超出最大承载尝试和第一个线程竞争。竞争失败不执行 不抛出异常
        );


        try {
            //最大承载max+queue 5+3=8 超出最大 会有可能触发异常java.util.concurrent.RejectedExecutionException
            for (int i = 0; i < 9; i++) {
                //使用用线程池来创建线程
                threadPool.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + " ok");

                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //使用完，关闭线程池
            threadPool.shutdown();
        }
    }
}
